/*************************************************
*                                                *
*  EasyBMP Cross-Platform Windows Bitmap Library *
*                                                *
*  Author: Paul Macklin                          *
*   email: macklin01@users.sourceforge.net       *
* support: http://easybmp.sourceforge.net        *
*                                                *
*          file: EasyBMP_DataStructures.h        *
*    date added: 05-02-2005                      *
* date modified: 12-01-2006                      *
*       version: 1.06                            *
*                                                *
*   License: BSD (revised/modified)              *
* Copyright: 2005-6 by the EasyBMP Project       *
*                                                *
* description: Defines basic data structures for *
*              the BMP class                     *
*                                                *
*************************************************/

#ifndef _EasyBMP_Custom_Math_Functions_
#define _EasyBMP_Custom_Math_Functions_
inline double EBMP_Square( double number )
{
    return number*number;
}

inline int EBMP_IntSquare( int number )
{
    return number*number;
}
#endif

int EBMP_IntPow( int base, int exponent );

#ifndef _EasyBMP_Defined_WINGDI
#define _EasyBMP_Defined_WINGDI
typedef unsigned char  ebmpBYTE;
typedef unsigned short ebmpWORD;
typedef unsigned int  ebmpDWORD;
#endif

#ifndef _EasyBMP_DataStructures_h_
#define _EasyBMP_DataStructures_h_

inline bool EBMP_IsBigEndian()
{
    short word = 0x0001;
    if ((*(char *)& word) != 0x01 )
    {
        return true;
    }
    return false;
}

inline ebmpWORD EBMP_FlipWORD( ebmpWORD in )
{
    return ( (in >> 8) | (in << 8) );
}

inline ebmpDWORD EBMP_FlipDWORD( ebmpDWORD in )
{
    return ( ((in&0xFF000000)>>24) | ((in&0x000000FF)<<24) |
             ((in&0x00FF0000)>>8 ) | ((in&0x0000FF00)<<8 )   );
}

// it's easier to use a struct than a class
// because we can read/write all four of the bytes
// at once (as we can count on them being continuous
// in memory

typedef struct EBMP_RGBApixel
{
    ebmpBYTE Blue;
    ebmpBYTE Green;
    ebmpBYTE Red;
    ebmpBYTE Alpha;
} EBMP_RGBApixel;

typedef struct tagBMFH
{
    ebmpWORD  bfType;
    ebmpDWORD bfSize;
    ebmpWORD  bfReserved1;
    ebmpWORD  bfReserved2;
    ebmpDWORD bfOffBits;
} BMFH, *BMFH_HANDLE;

BMFH_HANDLE BMFH_Construct();
void BMFH_Display(BMFH_HANDLE handle);
void BMFH_SwitchEndianess(BMFH_HANDLE handle);
void BMFH_Destruct(BMFH_HANDLE handle);

class BMIH
{
public:
    ebmpDWORD biSize;
    ebmpDWORD biWidth;
    ebmpDWORD biHeight;
    ebmpWORD  biPlanes;
    ebmpWORD  biBitCount;
    ebmpDWORD biCompression;
    ebmpDWORD biSizeImage;
    ebmpDWORD biXPelsPerMeter;
    ebmpDWORD biYPelsPerMeter;
    ebmpDWORD biClrUsed;
    ebmpDWORD biClrImportant;

    BMIH();
    void BMIH_Display( void );
    void BMIH_SwitchEndianess( void );
};

#endif
